package com.system.cacheClient.feign;

import com.system.cacheClient.common.CacheR;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.Set;

/**
 * ZSet缓存服务Feign客户端
 * 用于与缓存中心服务端进行通信
 */
@FeignClient(name = "cache-center-backend", path = "/cache/zset")
public interface ZSetCacheFeignClient extends BaseCacheFeignClient {
    
    /**
     * 获取ZSet缓存数据
     * @param key 缓存键
     * @return ZSet缓存数据
     */
    @Override
    @GetMapping("/{key}")
    <T> CacheR<T> get(@PathVariable("key") String key);
    
    /**
     * 设置ZSet缓存数据
     * @param key 缓存键
     * @param data ZSet缓存数据
     * @return 操作结果
     */
    @Override
    @PostMapping("/{key}")
    <T> CacheR<Boolean> set(@PathVariable("key") String key, @RequestBody T data);
    
    /**
     * 删除ZSet缓存数据
     * @param key 缓存键
     * @return 操作结果
     */
    @Override
    @DeleteMapping("/{key}")
    CacheR<Boolean> delete(@PathVariable("key") String key);
    
    /**
     * 设置ZSet缓存过期时间
     * @param key 缓存键
     * @param timeout 过期时间（秒），0表示立即过期
     * @return 操作结果
     */
    @Override
    @PostMapping("/{key}/expire")
    CacheR<Boolean> expire(@PathVariable("key") String key, @RequestParam("timeout") long timeout);
    
    /**
     * ZSet类型添加元素
     * @param key ZSet键
     * @param value 元素
     * @param score 分数
     * @return 添加成功的元素个数
     */
    @PostMapping("/{key}/zadd")
    <T> CacheR<Boolean> zadd(@PathVariable("key") String key, @RequestParam("score") double score, @RequestBody T value);
    
    /**
     * ZSet类型移除元素
     * @param key ZSet键
     * @param values 要移除的元素
     * @return 移除成功的元素个数
     */
    @DeleteMapping("/{key}/zrem")
    <T> CacheR<Long> zrem(@PathVariable("key") String key, @RequestBody T... values);
}